// File: jmcomic-core/src/main/java/dev/jukomu/jmcomic/entity/JmPageContent.java
package dev.jukomu.jmcomic.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.AbstractMap.SimpleEntry;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * 对应Python的JmPageContent，表示分页内容的通用基类。
 * 包含内容列表和总结果数。
 */
@EqualsAndHashCode(callSuper = true)
@Data
public abstract class JmPageContent extends JmBaseEntity implements IndexedEntity<JmPageContent.ContentItem> {

    /**
     * 内部类，表示分页内容中的一个条目。
     * 对应Python的Tuple[str, Dict[str, Any]]。
     */
    public static class ContentItem extends SimpleEntry<String, Map<String, Object>> {
        public ContentItem(String id, Map<String, Object> info) {
            super(id, info);
        }

        // Convenience getters for common fields
        public String getId() {
            return getKey();
        }

        public Map<String, Object> getInfo() {
            return getValue();
        }

        public String getName() {
            return (String) getInfo().get("name");
        }

        public List<String> getTags() {
            Object tags = getInfo().get("tags");
            if (tags instanceof List) {
                return (List<String>) tags;
            }
            return Collections.emptyList();
        }

        public String getAuthor() {
            return (String) getInfo().get("author");
        }

        public List<String> getAuthors() {
            Object authors = getInfo().get("author");
            if (authors instanceof List) {
                return (List<String>) authors;
            }
            return Collections.emptyList();
        }

        @Override
        public String toString() {
            return "ContentItem{id='" + getId() + "', info=" + getInfo() + "}";
        }
    }

    protected List<ContentItem> content; // 分页数据列表
    protected int total; // 总结果数

    /**
     * 构造函数。
     *
     * @param content 分页数据列表
     * @param total   总结果数
     */
    public JmPageContent(List<ContentItem> content, int total) {
        this.content = content != null ? Collections.unmodifiableList(content) : Collections.emptyList();
        this.total = total;
    }

    /**
     * 默认构造函数（用于JSON反序列化）。
     */
    public JmPageContent() {
        this(null, 0);
    }

    /**
     * 获取每页的大小。
     *
     * @return 每页大小
     */
    public abstract int getPageSize();

    /**
     * 获取总页数。
     *
     * @return 总页数
     */
    public int getPageCount() {
        int pageSize = getPageSize();
        if (pageSize == 0) return 0; // Avoid division by zero
        return (int) Math.ceil((double) total / pageSize);
    }

    /**
     * 获取内容列表。
     *
     * @return 内容列表
     */
    public List<ContentItem> getContent() {
        return content;
    }

    /**
     * 获取总结果数。
     *
     * @return 总结果数
     */
    public int getTotal() {
        return total;
    }

    /**
     * 返回ID的迭代器（Stream）。
     *
     * @return ID的Stream
     */
    public java.util.stream.Stream<String> iterId() {
        return content.stream().map(ContentItem::getId);
    }

    /**
     * 返回ID和标题的迭代器（Stream）。
     *
     * @return ID和标题的Stream
     */
    public java.util.stream.Stream<Map.Entry<String, String>> iterIdTitle() {
        return content.stream().map(item -> new SimpleEntry<>(item.getId(), item.getName()));
    }

    /**
     * 返回ID、标题和标签的迭代器（Stream）。
     *
     * @return ID、标题和标签的Stream
     */
    public java.util.stream.Stream<Triple<String, String, List<String>>> iterIdTitleTag() {
        return content.stream().map(item -> Triple.of(item.getId(), item.getName(), item.getTags()));
    }

    @Override
    public ContentItem get(int index) {
        return content.get(index);
    }

    @Override
    public int size() {
        return content.size();
    }

    @Override
    public boolean isPage() {
        return true;
    }

    // --- Setters for JSON deserialization if needed ---
    public void setContent(List<ContentItem> content) {
        this.content = content != null ? Collections.unmodifiableList(content) : Collections.emptyList();
    }

    public void setTotal(int total) {
        this.total = total;
    }
}